home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / dev / misc / ros_v2_1.lha / ros.doc < prev    next >
Text File  |  1997-01-20  |  75KB  |  1,900 lines

  1. TABLE OF CONTENTS
  2.  
  3. ros.library/--Overview--
  4. ros.library/--History--
  5. ros.library/ROSAddTimerInt
  6. ros.library/ROSAllocAudio
  7. ros.library/ROSAllocMem
  8. ros.library/ROSAwakeSystem
  9. ros.library/ROSChipsetCheck
  10. ros.library/ROSCPUCheck
  11. ros.library/ROSCPUClock
  12. ros.library/ROSDeleteFile
  13. ros.library/ROSDisableReq
  14. ros.library/ROSDiskLoad
  15. ros.library/ROSDiskState
  16. ros.library/ROSEnableReq
  17. ros.library/ROSFreeAudio
  18. ros.library/ROSFreeMem
  19. ros.library/ROSGetDMA
  20. ros.library/ROSGetInt
  21. ros.library/ROSGetKey
  22. ros.library/ROSKillSystem
  23. ros.library/ROSQueryKeys
  24. ros.library/ROSReadExe
  25. ros.library/ROSReadFile
  26. ros.library/ROSReadJoyPort
  27. ros.library/ROSRemTimerInt
  28. ros.library/ROSRequester
  29. ros.library/ROSScreenToBack
  30. ros.library/ROSScreenToFront
  31. ros.library/ROSSetCache
  32. ros.library/ROSSetCopper
  33. ros.library/ROSSetDMA
  34. ros.library/ROSSetExitHandler
  35. ros.library/ROSSetInt
  36. ros.library/ROSSetIntVec
  37. ros.library/ROSSetJoyPortAttrs
  38. ros.library/ROSSetTimerVec
  39. ros.library/ROSStartTimer
  40. ros.library/ROSStopTimer
  41. ros.library/ROSSysCall
  42. ros.library/ROSSysCallEnd
  43. ros.library/ROSWaitVBlank
  44. ros.library/ROSWriteFile
  45.  
  46. ros.library/--Overview--                              ros.library/--Overview--
  47.  
  48. This section describes the way how to use the RETIRE Operating System within
  49. your own applications:
  50.  
  51. The ros.library is an enhanced lowlevel.library. It's compatible with currently
  52. all available machines and CPU's (upto '060) and OS1.3 compatible too!
  53. The ROS provides additional functions to take over the entire system so it
  54. should be useful for demo & game coders.
  55. Another advantage is the ability to call important system functions (memory
  56. allocation, read, write) from a killed system.
  57. ROS offers a way to run your hardware bashing application within multitasking.
  58. And finally a ROS prefs file is provided to support custom settings.
  59. On startup ROS tries to load the ros.prefs from your ENV: directory. You may
  60. edit this file to configure the library for your needs.
  61.  
  62. But remember: It's impossible to open the ros.library from two applications at
  63. the same time. The second application will fail to open the library!
  64.  
  65. Programming guidelines:
  66.  
  67. The ros.library is a standard Amiga library so normal restrictions applies to
  68. function calls:  - a6 loaded with _ROSBase
  69.                  - d0/d1/a0/a1 scratch registers (destroyed by libcall)
  70.                  - functions can't be called from within interrupts
  71. Some ROS functions are special in these cases; they need no scratch registers
  72. or they may be called from within interrupts. Look at the appropriate 'note'
  73. comment for further information.
  74.  
  75. Do not call any ROS function from supervisor mode. The machine will crash!!!
  76. I think there is no need to switch to supervisor mode. Think of the '060 CPU;
  77. its supervisor model differs from the '040 CPU and a few basic commands will be
  78. emulated by software. Executing such a command from supervisor mode may crash
  79. the machine!!!
  80.  
  81. Call ROSKillSystem(ROSKSF_DEATHMODE) to take over the entire system. But do not
  82. modify DMA & interrupt stuff by yourself! Use the appropriate ROS routines!!!!!
  83. ROSKillSystem() opens a PAL-LowRes screen so all 'special' AGA registers are
  84. flushed (FMODE & sprites may not!?!) and it forces graphics boards to switch to
  85. the Amiga custom chip display.
  86.  
  87. With ROS V2 I introduce a new os-friendly mode. From now there are 4 possible
  88. methods killing the system:
  89.  
  90. - ROSKillSystem(ROSKSF_DEATHMODE):
  91.   Here you may trash all display related registers.
  92.   You may also use the blitter. It is owned by ROS so do not use OwnBlitter().
  93.   But remember: If you call a ROS function which may interrupt the deathmode
  94.   with ROSSysCall() you should finish all your blits before entering this
  95.   function (because the OS needs his blitter!).
  96.   ROS V2 uses a waitblit before entering any system function so the only thing
  97.   you have to do is to suppress all blits in your interrupt code until the
  98.   called function returns.
  99.  
  100. - ROSKillSystem(ROSKSF_SYSMODE):
  101.   Here is the system active but ROS opens a PAL-LowRes screen like in the
  102.   deathmode. This means real multitasking, screen switching, and so on. That's
  103.   why you shouldn't use the blitter. If you need it you have to call
  104.   OwnBlitter()/DisownBlitter(), but remember:
  105.   The Amiga OS relies on his blitter! Never allocate it for long times, the
  106.   system may run in a deadlock state!!!
  107.   In the sysmode you may trash all display related registers only if ROS
  108.   screen in front (preferably via copper).
  109.  
  110. - ROSKillSystem(ROSKSF_DEATHMODE|ROSKSF_OSFRIENDLY), new for ROS V2:
  111.   This is an system-friendly deathmode. ROS opens a screen according to the
  112.   supplied taglist. All input events are catched by ROS and your taskpriority
  113.   is raised to the input.device's priority for maximum performance.
  114.   Screen switching is disabled so you do not call system functions which may
  115.   depth-arrange screens -> result is a deadlock!
  116.   Now you do NOT trash any display related custom registers, use system calls
  117.   for screen manipulation.
  118.   ROSSetCopper() and ROSSetDMA() have no effect, use OS calls!
  119.  
  120. - ROSKillSystem(ROSKSF_SYSMODE|ROSKSF_OSFRIENDLY), new for ROS V2:
  121.   This is the system-friendly sysmode?!? ROS opens a screen according to the
  122.   supplied taglist. Multitasking and screen switching are active.
  123.   Do NOT trash any display related custom registers, use system calls.
  124.   ROSSetCopper() and ROSSetDMA() have no effect!
  125.  
  126. In all modes above you may trash the audio custom chip registers and the CIA
  127. registers if successfully allocated via appropriate ROS calls!
  128.  
  129. You should never touch the following:
  130. - DMACON and INTENA registers
  131. - CIA ICR registers
  132. - CPU interrupt vectors
  133. - serial registers
  134. - disk related registers
  135.  
  136. Tips 'n' hints for using ROS:
  137.  
  138. In a multitasking environment your vblank code may be called after the display
  139. is started depending on the speed of higher prioritized vblank interrupts.
  140. If you want to synchronize custom chip modifications with the display you
  141. should use the copper.
  142. And remember: The vblank frequency may vary (not always 50 Hz) if ROS screen
  143. behind other screens or if os-friendly mode!
  144.  
  145. Some words about the ROS file functions: First of all avoid these SENSELESS
  146. disk assigns. Since OS2.0 it's possible to load additional data files relativ
  147. to your programm directory by using a filename like this "progdir:data1".
  148. Use it!!! On OS1.3 ROS removes the "progdir:" prefix automatically from your
  149. supplied filename, so the only thing the user have to do is a "CD" to the
  150. programm directory before starting your application!
  151. Another ROS feature is the "disk waiting". That means if you load files from
  152. disk (providing the ROSRWF_DISKWAIT flag and a filename like "Disk1:data1") ROS
  153. is waiting for the right disk to be inserted.
  154. Prior to ROS V2 this disk-wait can't be cancelled (see also ROSDiskState()).
  155.  
  156.  
  157. Please read the following docs carefully!
  158. If you have questions, problems, idea's or bug reports feel free to contact me:
  159.  
  160. TIK/RETIRE via email:  Nico.Schmidt@Student.Uni-Magdeburg.de
  161.  
  162. or write to:           Nico Schmidt
  163.                        Möhlauer Str. 9
  164.                        06773 Jüdenberg
  165.                        GERMANY
  166.  
  167. Thanks to:  TODI/RETIRE for hints and useful idea's
  168.             PABLO/RETIRE for beta testing
  169.             Christian Oldiges for testing, hints & bug reports
  170.  
  171. ros.library/--History--                                ros.library/--History--
  172.  
  173.                                   ROS HISTORY
  174.  
  175. *******************************************************************************
  176. RELEASE 1.0, 29.12.95 (Library version 1.0)
  177.  
  178.     The first release.
  179.  
  180. *******************************************************************************
  181. RELEASE 1.1, 05.01.96 (Library version 1.1)
  182.  
  183.     Fixed two minor bugs:
  184.       - ROSCPUClock() shouldn't display a requester if no free CIA available,
  185.         but it does
  186.       - user vblank code was called from vblank server with priority 9, this
  187.         may confuse the timer.device (priority 0) and thus all CIA interrupts
  188.         (e.g. level6 p61) if it steals to much rastertime;
  189.         now user vblank code is executed from a priority 0 vblank server
  190.  
  191. *******************************************************************************
  192. RELEASE 1.2, 08.01.96 (Library version 1.2)
  193.  
  194.     Library name changed from 'ROS.library' to 'ros.library' because a library
  195.     name should always be a lower-case string (thanks to Thomas Kessler)
  196.  
  197. *******************************************************************************
  198. RELEASE 1.21, 05.02.96 (Library version 1.2)
  199.  
  200.     P61 initialization bug fixed (wrong offset if 020 optimization),
  201.     thanks to PABLO/RETIRE
  202.  
  203. *******************************************************************************
  204. RELEASE 2.0, 01.11.96 (Library version 2.0)
  205.  
  206.     Minor bug fixes:
  207.       - ROSOpenScreen() changed the forbidden state on retry, now fixed
  208.       - ROSWaitVBlank() now uses graphics/WaitTOF() in non-deathmode
  209.       - ROSSetCache() always enables the data cache on 68060, seems to be a
  210.         problem in 68060.library CacheControl() patch, now a workaround added
  211.       - Some errors fixed in this autodoc
  212.  
  213.     Changes:
  214.       - ROSChipsetCheck() examines gfxbase on OS3.0 instead of reading the
  215.         Alice/Lise ID chip registers
  216.       - CIA allocation rewritten, now ROS should run without CIA hardware if
  217.         you don't need a timer
  218.       - WaitBlits added in ROSKillSystem()/ROSAwakeSystem() & ROSSysCall()/
  219.         ROSSysCallEnd() functions
  220.  
  221.     New features:
  222.       - New os-friendly mode for ROSKillSystem() added to support standard
  223.         OS screens for e.g. CyberGraphics applications
  224.       - Joyport routines ROSReadJoyPort()/ROSSetJoyPortAttrs() added
  225.       - ROSDiskLoad()/ROSDiskState() added
  226.       - Now the user may disable audio allocation via ros.prefs
  227.       - Joy/mouse buttons may act as exit keys (see ROSSetJoyPortAttrs())
  228.  
  229. *******************************************************************************
  230. RELEASE 2.1, 21.01.97 (Library version 2.1)
  231.  
  232.     Minor bug fixes:
  233.       - Credits requester wasn't font-sensitive on OS1.3
  234.       - Accessing "progdir:"-relative files using ROS r/w functions did not
  235.         work on OS1.3, wrong string comparison (thanks to Christian Oldiges)
  236.       - Some errors fixed in this autodoc
  237.  
  238.     Changes:
  239.       - ROSCPUClock() now uses timer.device if there are no free cia timers
  240.  
  241. *******************************************************************************
  242.  
  243. ros.library/ROSAddTimerInt                          ros.library/ROSAddTimerInt 
  244.  
  245.    NAME
  246.         ROSAddTimerInt -- add an interrupt that is executed at regular
  247.                           intervals
  248.  
  249.    SYNOPSIS
  250.         intHandle = ROSAddTimerInt(Flags, intRoutine);
  251.         D0                         D0     A0
  252.  
  253.         ULONG AddTimerInt(ULONG, APTR);
  254.  
  255.    FUNCTION
  256.         Calling this routine causes the system to allocate a CIA timer
  257.         depending on 'Flags' and set up 'intRoutine' to service any interrupts
  258.         caused by the timer.
  259.         Although the timer is allocated it is neither running, nor enabled.
  260.         ROSStartTimer() must be called to establish the time interval and
  261.         start the timer.
  262.  
  263.         The routine is called from within an interrupt, so normal
  264.         restrictions apply. On entry A5 holds the custom base ($dff000) and
  265.         A6 holds _ROSBase. Your code may trash all registers.
  266.  
  267.         The CIA timer used by this routine is not guaranteed to always be
  268.         the same. This routine utilizes the CIA resource and uses an
  269.         unallocated CIA timer.
  270.  
  271.         You should remove the timer with ROSRemTimerInt().
  272.         Closing the ros.library removes this timer interrupt automatically.
  273.  
  274.    INPUTS
  275.         Flags - specify the timer to allocate:
  276.                         TIMF_ANY  - try to allocate any timer 
  277.                         TIMF_LEV2 - try to allocate level 2 timers (CIA A)
  278.                         TIMF_LEV6 - try to allocate level 6 timers (CIA B)
  279.         intRoutine - the routine to invoke upon timer interrupts.
  280.  
  281.    RESULT
  282.         intHandle - a handle used to manipulate the interrupt, or NULL
  283.                     if it was not possible to attach the routine.
  284.  
  285.    NOTE
  286.         If allocation failed a Retry/Cancel-Requester appears to inform the
  287.         user about the problem (if not suppressed and if not in deathmode).
  288.  
  289.         This function interrupts the deathmode state with ROSSysCall()!
  290.  
  291.    SEE ALSO
  292.         ROSRemTimerInt(), ROSStartTimer(), ROSStopTimer(), ROSSetTimerVec()
  293.  
  294. ros.library/ROSAllocAudio                            ros.library/ROSAllocAudio
  295.  
  296.    NAME
  297.         ROSAllocAudio -- allocate audio channels
  298.  
  299.    SYNOPSIS
  300.         success = ROSAllocAudio()
  301.         D0                     
  302.  
  303.         BOOL ROSAllocAudio(VOID);
  304.  
  305.    FUNCTION
  306.         This function allocates all audio channels. Audio DMA is updated
  307.         so that matches with current DMA settings (former ROSSetDMA() calls).
  308.         --> New for V2: The user may disable audio allocation via ros.prefs!
  309.  
  310.         You should free the audio channels with ROSFreeAudio().
  311.         Closing the ros.library frees audio channels automatically.
  312.  
  313.    RESULT
  314.         success - boolean
  315.  
  316.    NOTE
  317.         If allocation failed a Retry/Cancel-Requester appears to inform the
  318.         user about the problem (if not suppressed and if not in deathmode).
  319.  
  320.         This function interrupts the deathmode state with ROSSysCall()!
  321.  
  322.    SEE ALSO
  323.         ROSFreeAudio()
  324.  
  325. ros.library/ROSAllocMem                                ros.library/ROSAllocMem
  326.  
  327.    NAME
  328.         ROSAllocMem -- allocate memory and keep track of the size
  329.  
  330.    SYNOPSIS
  331.         memoryBlock = ROSAllocMem(byteSize, attributes, alignmask)
  332.         D0                        D0        D1          D2
  333.  
  334.         VOID *ROSAllocMem(ULONG, ULONG, ULONG);
  335.  
  336.    FUNCTION
  337.         This function works identically to Exec's AllocMem(), but tracks the
  338.         size of the allocation and provides additional memory alignment.
  339.  
  340.         See the AllocMem() documentation for details.
  341.  
  342.         You should free the memory with ROSFreeMem().
  343.         Do NOT use exec.library functions!!!!!!!
  344.         Closing the ros.library frees allocated memory automatically.
  345.  
  346.    INPUTS
  347.         byteSize - # of bytes to allocate
  348.         attributes - memory requirements
  349.         alignmask - used to allocate memory at special boundaries, if NULL
  350.                     Exec's standard alignment applies
  351.  
  352.                     --> newaddr = memaddr AND NOT(alignmask)
  353.                     e.g. mem align: even by 8 bytes -> alignmask = $00000007
  354.  
  355.    RESULT
  356.         memoryBlock - a pointer to the newly allocated memory block or NULL
  357.  
  358.    NOTE
  359.         This function interrupts the deathmode state with ROSSysCall()!
  360.  
  361.    SEE ALSO
  362.         ROSFreeMem(), exec.lib/AllocMem()
  363.  
  364. ros.library/ROSAwakeSystem                          ros.library/ROSAwakeSystem
  365.  
  366.    NAME
  367.         ROSAwakeSystem -- close ROS screen and awake from deathmode
  368.  
  369.    SYNOPSIS
  370.         ROSAwakeSystem()
  371.  
  372.         VOID ROSAwakeSystem(VOID);
  373.  
  374.    FUNCTION
  375.         This function deallocates all things allocated with ROSKillSystem().
  376.         It closes the opened screen and sets the display related DMA to the
  377.         appropriate system values.
  378.         Calling this function without a matching ROSKillSystem() is harmless.
  379.  
  380.         Closing the ros.library calls automatically ROSAwakeSystem().
  381.  
  382.    SEE ALSO
  383.         ROSKillSystem()
  384.  
  385. ros.library/ROSChipsetCheck                        ros.library/ROSChipsetCheck
  386.  
  387.    NAME
  388.         ROSChipsetCheck -- check if desired custom chipset available
  389.  
  390.    SYNOPSIS
  391.         result = ROSChipsetCheck(chipsetbit)
  392.         D0                       D0        
  393.  
  394.         UWORD ROSChipsetCheck(UWORD);
  395.  
  396.    FUNCTION
  397.         Use this routine to obtain the available chipset.
  398.         As input you may specify the chipset requirement (bitnumber) and if
  399.         NOT found a requester appears to inform the user about his lack of
  400.         hardware (if not suppressed and if not in deathmode).
  401.  
  402.    INPUTS
  403.         chipsetbit - the required chipset; currently defined are
  404.                          ROSCSB_ECS for at least HR-AGNUS rev3 and 8373 DENISE
  405.                          ROSCSB_AGA for at least ALICE rev2 and LISA,
  406.                      or -1 for only obtaining chipset (no requester appears)
  407.  
  408.    RESULT
  409.         result - chipset flags (ROSCF_xxx, AGA includes the ECS flag) or NULL
  410.                  if required chipset not found
  411.  
  412. ros.library/ROSCPUCheck                                ros.library/ROSCPUCheck
  413.  
  414.    NAME
  415.         ROSCPUCheck -- check if desired CPU/FPU available
  416.  
  417.    SYNOPSIS
  418.         result = ROSCPUCheck(cpubit)
  419.         D0                   D0        
  420.  
  421.         UWORD ROSCPUCheck(UWORD);
  422.  
  423.    FUNCTION
  424.         Use this routine to obtain the available CPU/FPU.
  425.         As input you may specify the processor requirement (bitnumber) and if
  426.         NOT found a requester appears to inform the user about his hardware
  427.         problem (if not suppressed and if not in deathmode).
  428.         Call this routine twice if you need a CPU (AFB_680x0) check and a FPU 
  429.         (AFB_6888x/FPU40) check.
  430.  
  431.    INPUTS
  432.         cpubit - the required CPU/FPU -> AttnFlags AFB_xxxxx
  433.                  or -1 for only obtaining CPU/FPU (no requester appears)
  434.  
  435.    RESULT
  436.         result - AttnFlags or NULL if required chipset not found
  437.  
  438.    NOTE
  439.         This code handles the FPU40 flag correct: it's only valid if AFB_68040
  440.         set. Keep this in mind if you examine the RESULT (AttnFlags)!!!
  441.  
  442. ros.library/ROSCPUClock                                ros.library/ROSCPUClock
  443.  
  444.    NAME
  445.         ROSCPUClock -- CPU/FPU clock calculation
  446.  
  447.    SYNOPSIS
  448.         CPU/FPUclock = ROSCPUClock()
  449.         D0  D1                          
  450.  
  451.         ULONG/ULONG ROSCPUClock(VOID);
  452.  
  453.    FUNCTION
  454.         Calculate CPU/FPU clock. The values returned should be accurate at
  455.         least 1/10 MHz, so it's enough for everyone.
  456.         This routine tries to allocate a cia timer. On failure the timer.device
  457.         is used (only on OS2.0+) which is less accurate so it's best to call
  458.         this routine first (e.g. before any timer function).
  459.         ROSCPUClock() works with all (currently) available processors and it
  460.         takes only a few milliseconds!!!
  461.  
  462.    RESULT
  463.         CPUclock - the CPU clock in kHz or NULL on error (see also BUGS)
  464.         FPUclock - the FPU clock in kHz or NULL on error
  465.  
  466.    NOTE
  467.         This function interrupts the deathmode state with ROSSysCall()!
  468.  
  469.    BUGS
  470.         In some rare cases the function returns NULL:
  471.          - Allocation problems (cia timers, timer.device)
  472.          - on 68000/10 with only chipmem
  473.          - on _really_ slow machines (e.g. a 10MHz 68040?!?)
  474.          - on 68040/60 systems where it's impossible to turn on instruction
  475.            cache (e.g. A4000 with only chipmem and 68040.library loaded)
  476.  
  477.         The FPU clock is ALWAYS NULL for 68881/2 systems because I'm
  478.         (currently) unable to find a reliable algorithm (blame on me).
  479.         It's hard to deal with the asynchronous data transfer between CPU
  480.         and FPU.
  481.         On 68040/60 systems with FPU the returned value is the same like
  482.         CPU clock.
  483.  
  484. ros.library/ROSDeleteFile                            ros.library/ROSDeleteFile
  485.  
  486.    NAME
  487.         ROSDeleteFile -- Delete a file or directory
  488.  
  489.    SYNOPSIS
  490.         success = ROSDeleteFile(flags, name)
  491.         D0                      D0     A0
  492.  
  493.         ULONG ROSDeleteFile(ULONG, STRPTR);
  494.  
  495.    FUNCTION
  496.         This attempts to delete the file or directory specified by 'name'.
  497.         Note that all the files within a directory must be deleted before the
  498.         directory itself can be deleted.
  499.  
  500.         If ROSRWF_DISKWAIT flag set the routine assumes that you want to delete
  501.         'name' from a floppy. This means:
  502.          - waiting for the right disk to be inserted
  503.            (implementation: DOS error codes DEVICE_NOT_MOUNTED, NOT_A_DOS_DISK,
  504.            NO_DISK force retry until any other error occurs)
  505.            --> New for V2: waiting may be cancelled via ROSDiskState()
  506.          - waiting until disk drive stopped
  507.            (implementation: polling disk.resource until drives are ready)
  508.  
  509.         Since OS2.0 it's possible to delete files from your program path
  510.         instead of the current directory using progdir:xxx.
  511.         On OS1.3 the "progdir:" string is automatically removed by ROS so you
  512.         don't have to worry about it. The only thing the user have to do is a
  513.         "CD" to the program directory before starting (only on OS1.3). ;-)
  514.  
  515.         WARNING: It may be dangerous to use this routine within deathmode!
  516.                  Because of the AMIGA's multitasking facilities it isn't
  517.                  possible (isn't it???) to wait till the final end of a delete
  518.                  operation. That's why I use a simple delay of 2 seconds after
  519.                  any delete operation in deathmode. If your filesystem is to
  520.                  slow to write all the data within this time your partition
  521.                  will be NOT validated!!!
  522.                  You've been warned!!!
  523.  
  524.    INPUTS
  525.         flags - use ROSRWF_DISKWAIT if you want to delete from a floppy
  526.         name - pointer to a null-terminated string
  527.    
  528.    RESULT
  529.         success - DOS error code on failure or NULL for success
  530.  
  531.    NOTE
  532.         This function interrupts the deathmode state with ROSSysCall()!
  533.  
  534.    SEE ALSO
  535.         dos.lib/DeleteFile(), ROSDiskState()
  536.  
  537. ros.library/ROSDisableReq                            ros.library/ROSDisableReq
  538.  
  539.    NAME
  540.         ROSDisableReq -- suspend requesters for our task
  541.  
  542.    SYNOPSIS
  543.         ROSDisableReq()
  544.                              
  545.         VOID ROSDisableReq(VOID);
  546.  
  547.    FUNCTION
  548.         Suspend all upcoming requesters for our task (ROS- and DOS-Requesters).
  549.         By default requesters are enabled.
  550.  
  551.    SEE ALSO
  552.         ROSEnableReq(), ROSRequester()
  553.  
  554. ros.library/ROSDiskLoad                                ros.library/ROSDiskLoad
  555.  
  556.    NAME
  557.         ROSDiskLoad -- returns whether your program loaded from disk  (V2)
  558.  
  559.    SYNOPSIS
  560.         result = ROSDiskLoad(diskname)
  561.         D0                   A0
  562.  
  563.         BOOL ROSDiskLoad(STRPTR);
  564.  
  565.    FUNCTION
  566.         Returns whether your program loaded from a disk labeled 'diskname' or
  567.         not. Therefore you have to pass the name of your disk to this function.
  568.         After this you should set the flags of all subsequent read/write calls
  569.         according to the result (e.g. ROSReadFile(ROSRWF_DISKWAIT, ...) if the
  570.         result was TRUE)!
  571.  
  572.         Implementation: 
  573.         This function compares the 'diskname' with the name of the disk where
  574.         the home dir of your program (on OS1.3 the current dir) is located. If
  575.         both strings are equal (case-insensitive) this function returns TRUE.
  576.         Whenever locale.library is installed in your system, the string
  577.         comparision is replaced by language-specific code.
  578.  
  579.    INPUTS
  580.         diskname - name of the disk
  581.    
  582.    RESULT
  583.         result - TRUE if your program loaded from a disk labeled 'diskname'
  584.  
  585.    NOTE
  586.         This function interrupts the deathmode state with ROSSysCall()!
  587.  
  588.    SEE ALSO
  589.         ROSDeleteFile(), ROSReadExe(), ROSReadFile(), ROSWriteFile()
  590.  
  591. ros.library/ROSDiskState                              ros.library/ROSDiskState
  592.  
  593.    NAME
  594.         ROSDiskState -- return state of current disk operation  (V2)
  595.  
  596.    SYNOPSIS
  597.         state = ROSDiskState(diskbreak)
  598.         D0                   D0
  599.  
  600.         UWORD ROSDiskState(BOOL);
  601.  
  602.    FUNCTION
  603.         This function is used to determine the state of the current disk
  604.         operation. Therefore it's save to call this function from within
  605.         interrupts.
  606.         Set 'diskbreak' TRUE for cancelling the 'wait for disk'-state of
  607.         current disk operation. In this case the current disk operation
  608.         returns with one of the following DOS error codes:
  609.         DEVICE_NOT_MOUNTED, NOT_A_DOS_DISK or NO_DISK.
  610.  
  611.    INPUTS
  612.         diskbreak - TRUE for cancelling the 'wait for disk'-state
  613.    
  614.    RESULT
  615.         state - the state of the current disk operation (defines from ros.i):
  616.                    DISK_NOP        currently no disk operation, 'diskbreak' has
  617.                                    no effect
  618.                    DISK_Init       initialize (check for disk) in progress
  619.                    DISK_Waiting    ROS is waiting for the (right) disk to be
  620.                                    inserted, cancel this with 'diskbreak'=TRUE
  621.                    DISK_Busy       read/write/delete in progress
  622.  
  623.    NOTE
  624.         This call is guaranteed to preserve all registers and is save to call
  625.         from interrupts.
  626.  
  627.    SEE ALSO
  628.         ROSDeleteFile(), ROSReadExe(), ROSReadFile(), ROSWriteFile()
  629.  
  630. ros.library/ROSEnableReq                              ros.library/ROSEnableReq
  631.  
  632.    NAME
  633.         ROSEnableReq -- permit requesters for our task
  634.  
  635.    SYNOPSIS
  636.         ROSEnableReq()
  637.                              
  638.         VOID ROSEnableReq(VOID);
  639.  
  640.    FUNCTION
  641.         Permit all upcoming requesters for our task (ROS- and DOS-Requesters).
  642.         By default requesters are enabled.
  643.  
  644.    SEE ALSO
  645.         ROSDisableReq(), ROSRequester()
  646.  
  647. ros.library/ROSFreeAudio                              ros.library/ROSFreeAudio
  648.  
  649.    NAME
  650.         ROSFreeAudio -- free audio channels
  651.  
  652.    SYNOPSIS
  653.         ROSFreeAudio()
  654.         
  655.         VOID ROSFreeAudio(VOID);
  656.  
  657.    FUNCTION
  658.         This function removes probably installed audio interrupt handlers and
  659.         resets the audio DMA (former system values). Then channels are freed.
  660.  
  661.         Freeing channels without allocation is harmless.
  662.    
  663.         Closing the ros.library frees audio channels automatically.
  664.  
  665.    NOTE
  666.         This function interrupts the deathmode state with ROSSysCall()!
  667.  
  668.    SEE ALSO
  669.         ROSAllocAudio()
  670.  
  671. ros.library/ROSFreeMem                                  ros.library/ROSFreeMem
  672.  
  673.    NAME
  674.         ROSFreeMem -- return allocated memory to the system
  675.  
  676.    SYNOPSIS
  677.         ROSFreeMem(memoryBlock)
  678.                    A0
  679.  
  680.         VOID ROSFreeMem(VOID *);
  681.  
  682.    FUNCTION
  683.         Free an allocation made by the ROSAllocMem() call. The memory will be
  684.         returned to the system pool from which it came.
  685.  
  686.         WARNING: Before freeing some chip memory be sure that the blitter has
  687.                  finished its work within this memory block!!!
  688.                  The same applies to closing the ros.library.
  689.  
  690.         Closing the ros.library frees allocated memory automatically.
  691.  
  692.    NOTE
  693.         Passing a wrong pointer is harmless ;-)
  694.  
  695.         This function interrupts the deathmode state with ROSSysCall()!
  696.  
  697.    INPUTS
  698.         memoryBlock - pointer to the memory block to free, or NULL
  699.  
  700.    SEE ALSO
  701.         ROSAllocMem()
  702.  
  703. ros.library/ROSGetDMA                                    ros.library/ROSGetDMA
  704.  
  705.    NAME
  706.         ROSGetDMA -- obtain DMA settings
  707.  
  708.    SYNOPSIS
  709.         DMACONR = ROSGetDMA()
  710.         D0                     
  711.  
  712.         UWORD ROSGetDMA(VOID);
  713.  
  714.    FUNCTION
  715.         This function returns current DMA settings (set via ROSSetDMA()).
  716.  
  717.         Do NOT use "move.w $dff002,d0" !!!!!!!
  718.         This may return wrong bits if you are in non-deathmode (e.g. copper
  719.         DMA -> the OS may change the bit during screen switching).
  720.         But ROSGetDMA() returns the right value.
  721.    
  722.         Closing the ros.library reset former system DMA.
  723.  
  724.    RESULT
  725.         DMACONR - DMA settings set via ROSSetDMA() with additional BBUSY/BZERO
  726.                   bits (unsupported (disk) & unallocated (audio, ...) DMA bits
  727.                   are always 0)
  728.  
  729.    NOTE
  730.         This call is guaranteed to preserve all other registers and is save
  731.         to call from interrupts.
  732.  
  733.    SEE ALSO
  734.         ROSSetDMA()
  735.  
  736. ros.library/ROSGetInt                                    ros.library/ROSGetInt
  737.  
  738.    NAME
  739.         ROSGetInt -- obtain interrupt settings
  740.  
  741.    SYNOPSIS
  742.         INTENAR = ROSGetInt()
  743.         D0                     
  744.  
  745.         UWORD ROSGetInt(VOID);
  746.  
  747.    FUNCTION
  748.         This function returns interrupt enable bits (set via ROSSetDMA()).
  749.         Additional bits are defined in "ros.i".
  750.  
  751.         Do NOT use "move.w $dff01c,d0" !!!!!!! This may return wrong bits.
  752.    
  753.         Closing the ros.library reset former system interrupt bits.
  754.  
  755.    RESULT
  756.         INTENAR - Interrupt bits set via ROSSetInt()
  757.                   Note: level 1/2/5/6 bits (disk, serial, timer) are not
  758.                         supported!!!
  759.                         Instead additonal bits are defined:  - KEYB
  760.                                                              - CIAATIMA/B
  761.                                                              - CIABTIMA/B
  762.  
  763.    NOTE
  764.         This call is guaranteed to preserve all other registers and is save
  765.         to call from interrupts.
  766.  
  767.    SEE ALSO
  768.         ROSSetInt(), libraries/ros.i
  769.  
  770. ros.library/ROSGetKey                                    ros.library/ROSGetKey
  771.  
  772.    NAME
  773.         ROSGetKey -- returns the currently pressed rawkey code and qualifiers
  774.  
  775.    SYNOPSIS
  776.         key = ROSGetKey()
  777.         D0
  778.  
  779.         ULONG ROSGetKey(VOID);
  780.  
  781.    FUNCTION
  782.         This function returns the currently pressed non-qualifier key and
  783.         all pressed qualifiers.
  784.  
  785.         The values returned by this function are not modified by which
  786.         window/screen currently has input focus.
  787.  
  788.    RESULT
  789.         key - key code for the last non-qualifier key pressed in the low
  790.               order word ($0..$67). If no key is pressed this word will be $ff.
  791.               The upper order word contains the qualifiers which can be found
  792.               within the long word as follows (lowlevel.library like):
  793.                         Qualifier               Key
  794.                         LLKB_LSHIFT             Left Shift
  795.                         LLKB_RSHIFT             Rigt Shift
  796.                         LLKB_CAPSLOCK           Caps Lock
  797.                         LLKB_CONTROL            Control
  798.                         LLKB_LALT               Left Alt
  799.                         LLKB_RALT               Right Alt
  800.                         LLKB_LAMIGA             Left Amiga
  801.                         LLKB_RAMIGA             Right Amiga    
  802.  
  803.    NOTE
  804.         This call is guaranteed to preserve all other registers and is save
  805.         to call from interrupts.
  806.  
  807.    SEE ALSO
  808.         lowlevel.lib/GetKey(), libraries/lowlevel.i
  809.  
  810. ros.library/ROSKillSystem                            ros.library/ROSKillSystem
  811.  
  812.    NAME
  813.         ROSKillSystem -- kill the system and open ROS screen
  814.  
  815.    SYNOPSIS
  816.         success = ROSKillSystem(mode, taglist)
  817.         D0                      D0    A0
  818.  
  819.         BOOL/struct Screen *ROSKillSystem(ULONG, struct TagItem *);
  820.  
  821.    FUNCTION
  822.         Depending on the mode this function acts different:
  823.  
  824.         In non-os-friendly mode this function opens a PAL-LowRes screen,
  825.         installs your copper list and sets additional DMA (copper, bitplane,
  826.         sprite). By default all DMA will be cleared.
  827.         Whenever this screen is the frontmost you may bash all display related
  828.         custom chip registers (preferably via copper list).
  829.         If the ROS is unable to open the screen or if it's not PAL-LowRes
  830.         (promoted screen) a Retry/Cancel-Requester appears (if not suppressed).
  831.  
  832.         If you specify the flag KILLF_DEATHMODE the multitasking will be turned
  833.         off. Now ROS has taken over the entire system. But interrupts and DMA
  834.         should only be set with ROS functions!!!
  835.         The blitter is owned via OwnBlitter() so you may use it.
  836.         But before using you should do a WaitBlit because it may still working,
  837.         --> this is now obsolete with ROS V2.
  838.         You may interrupt the deathmode via ROSSysCall(). At this time the
  839.         blitter will be disowned so you do NOT use it during a SysCall!!!
  840.  
  841.         Call ROSKillSystem() with KILLF_SYSMODE to run your application within
  842.         multitasking. But be polite and bash the hardware as less as possible.
  843.         The blitter is under system control so you should use OwnBlitter()/
  844.         DisownBlitter() if you need it. But allocate the blitter only for a
  845.         short time because the system uses it too!
  846.  
  847.         With ROS V2 we introduce a new os-friendly mode. From now it's possible
  848.         to use the death/sysmode with a standard OS screen by passing the
  849.         appropriate taglist to this function. NO MORE HARDWARE BASHING!!!
  850.         Use OS calls for screen rendering! You have to clear the mouse pointer
  851.         with OS calls too! (look at --Overview-- for further details)
  852.         This feature works only on OS2.0+. Setting this flag on OS1.3 this call
  853.         fails with "Couldn't open OS2.0 screen" error.
  854.  
  855.         Note: Do not make this screen public because ROS captures most rawkey
  856.               events (see also ROSSetIntVec()/KEYB-Int) so applications opened
  857.               on ROS screen will never receive it. The os-friendly mode should
  858.               be used to provide compatibility with e.g. CyberGraphics!
  859.  
  860.         Also check out the ROS_KillSysFlags (the current ROS state).
  861.         You may call ROSKillSystem() multiple times to switch between death- 
  862.         and sysmode, but calling again the KILLF_OSFRIENDLY flag has NO effect.
  863.         To swith between os-friendly and bashmode you have to call first
  864.         ROSAwakeSystem() to close the current ROS screen and after that
  865.         call ROSKillSystem() to re-open the screen.
  866.         A switch from sysmode into deathmode automatically makes the ROS screen
  867.         the frontmost so you don't have to call ROSScreenToFront().
  868.         Once ROSKillSystem() returns successful further calls to this function
  869.         will never fail so there is no need to check the result again.
  870.  
  871.         You should return to the system with ROSAwakeSystem().
  872.         Closing the ros.library calls ROSAwakeSystem() automatically.
  873.  
  874.    INPUTS
  875.         mode - KILLF_SYSMODE for a multitasking environment
  876.                KILLF_DEATHMODE to take over the entire system
  877.                --> New for V2: KILLF_OSFRIENDLY for os-friendly mode,
  878.                use it in conjunction with one of the flags above
  879.                (not supported if ROS runs on OS1.3, ROSKillSystem() will fail)
  880.         taglist - ptr to taglist passed to OpenScreen(), only neccessary if
  881.                   KILLF_OSFRIENDLY
  882.  
  883.    RESULT
  884.         success - result type depends on the KILLF_OSFRIENDLY flag:
  885.                   if flag set (ROS V2): ptr to ROS screen or NULL on failure
  886.                   if flag not set: FALSE if ROS was unable to open the
  887.                                    PAL-LowRes screen, else TRUE
  888.  
  889.    SEE ALSO
  890.         ROSAwakeSystem(), ROSSysCall(), ROSSysCallEnd()
  891.  
  892. ros.library/ROSQueryKeys                              ros.library/ROSQueryKeys
  893.  
  894.    NAME
  895.         ROSQueryKeys -- return the states for a set of keys
  896.  
  897.    SYNOPSIS
  898.         ROSQueryKeys(queryArray, arraySize)
  899.                      A0          D0
  900.  
  901.         VOID ROSQueryKeys(struct KeyQuery *, UBYTE);
  902.  
  903.    FUNCTION
  904.         Scans the keyboard to determine which of the rawkey codes
  905.         listed in the 'queryArray' are currently pressed. The state for each
  906.         key is returned in the array.
  907.  
  908.         The values returned by this function are not modified by which
  909.         window/screen currently has input focus.
  910.  
  911.    INPUTS
  912.         queryArray - an array of KeyQuery structures. The kq_KeyCode fields
  913.                      of these structures should be filled with the rawkey
  914.                      codes you wish to query about. Upon return from this
  915.                      function, the kq_Pressed field of these structures
  916.                      will be set to TRUE if the associated key is down,
  917.                      and FALSE if not.
  918.         arraySize - number of key code entries in 'queryArray'
  919.  
  920.    NOTE
  921.         This function is save to call from interrupts.
  922.  
  923.    SEE ALSO
  924.         lowlevel.lib/QueryKeys(), libraries/lowlevel.i
  925.  
  926. ros.library/ROSReadExe                                  ros.library/ROSReadExe
  927.  
  928.    NAME
  929.         ROSReadExe -- scatterload a loadable file
  930.  
  931.    SYNOPSIS
  932.         seglist/errorcode = ROSReadExe(flags, name)
  933.         D0      D1                     D0     A0
  934.  
  935.         BPTR/ULONG ROSReadExe(ULONG, STRPTR);
  936.  
  937.    FUNCTION
  938.         This function tries to scatterload the file 'name' using dos.library's
  939.         LoadSeg().
  940.  
  941.         If ROSRWF_DISKWAIT flag set the routine assumes that you want to load
  942.         'name' from a floppy. This means:
  943.          - waiting for the right disk to be inserted
  944.            (implementation: DOS error codes DEVICE_NOT_MOUNTED, NOT_A_DOS_DISK,
  945.            NO_DISK force retry until any other error occurs)
  946.            --> New for V2: waiting may be cancelled via ROSDiskState()
  947.          - waiting until disk drive stopped
  948.            (implementation: polling disk.resource until drives are ready)
  949.  
  950.         Since OS2.0 it's possible to load files from your program path instead
  951.         of the current directory using progdir:xxx.
  952.         On OS1.3 the "progdir:" string is automatically removed by ROS so you
  953.         don't have to worry about it. The only thing the user have to do is a
  954.         "CD" to the program directory before starting (only on OS1.3). ;-)
  955.  
  956.         You should unload the file with ROSFreeMem(seglist)!
  957.         Do NOT use dos.library's UnLoadSeg()!!!!!!!
  958.         Closing the ros.library unloads file automatically.
  959.  
  960.    INPUTS
  961.         flags - use ROSRWF_DISKWAIT if you want to load from a floppy
  962.         name - pointer to a null-terminated string
  963.    
  964.    RESULT
  965.         seglist - BCPL pointer to a seglist or NULL if error
  966.         errorcode - DOS error code on failure (may be NULL!!!)
  967.  
  968.    NOTE
  969.         This function interrupts the deathmode state with ROSSysCall()!
  970.  
  971.    SEE ALSO
  972.         ROSDiskState(), ROSFreeMem(), dos.lib/LoadSeg()
  973.  
  974. ros.library/ROSReadFile                                ros.library/ROSReadFile
  975.  
  976.    NAME
  977.         ROSReadFile -- read a number bytes from a file
  978.  
  979.    SYNOPSIS
  980.         actLength/errorcode/actBuffer = ROSReadFile(flags, length, offset,
  981.         D0        D1        A0                      D0     D1      D2      
  982.                                                memtype, memalign, name, buffer)
  983.                                                D3       D4        A0    A1
  984.  
  985.         ULONG/ULONG/VOID *  ROSReadFile(ULONG, ULONG, ULONG,
  986.                                                  ULONG, ULONG, STRPTR, VOID *);
  987.  
  988.    FUNCTION
  989.         This function tries to load 'length' bytes from the file 'name' using
  990.         dos.library's Read(). Set 'length` = 0 to load the whole file.
  991.         A1 points to a buffer where the data should be placed, or set A1=0 
  992.         to force an automatic memory allocation. In this case you must specify
  993.         'memtype' and 'memalign' (see also ROSAllocMem()).
  994.       
  995.         If ROSRWF_DISKWAIT flag set the routine assumes that you want to load
  996.         'name' from a floppy. This means:
  997.          - waiting for the right disk to be inserted
  998.            (implementation: DOS error codes DEVICE_NOT_MOUNTED, NOT_A_DOS_DISK,
  999.            NO_DISK force retry until any other error occurs)
  1000.            --> New for V2: waiting may be cancelled via ROSDiskState()
  1001.          - waiting until disk drive stopped
  1002.            (implementation: polling disk.resource until drives are ready)
  1003.  
  1004.         Since OS2.0 it's possible to load files from your program path instead
  1005.         of the current directory using progdir:xxx.
  1006.         On OS1.3 the "progdir:" string is automatically removed by ROS so you
  1007.         don't have to worry about it. The only thing the user have to do is a
  1008.         "CD" to the program directory before starting (only on OS1.3). ;-)
  1009.  
  1010.         You should free the automatically allocated memory with ROSFreeMem()!
  1011.         Closing the ros.library unloads file automatically (if automatic
  1012.         memory allocation).
  1013.  
  1014.    INPUTS
  1015.         flags - use ROSRWF_DISKWAIT if you want to load from a floppy
  1016.         length - number of bytes to load or NULL for the whole file
  1017.         offset - number of bytes to skip before reading from file
  1018.         memtype - see ROSAllocMem(), only neccessary if 'buffer' == NULL
  1019.         memalign - see ROSAllocMem(), only neccessary if 'buffer' == NULL
  1020.         name - pointer to a null-terminated string
  1021.         buffer - pointer to buffer or NULL to force an automitic memory
  1022.                  allocation
  1023.    
  1024.    RESULT
  1025.         actLength - number of bytes read from file or -1 if error
  1026.         errorcode - DOS error code on failure (may be NULL!!!)
  1027.         actBuffer - points to loaded data, only valid on success (D0 <> -1)!!!
  1028.  
  1029.    NOTE
  1030.         This function interrupts the deathmode state with ROSSysCall()!
  1031.  
  1032.    SEE ALSO
  1033.         ROSAllocMem(), ROSDiskState(), ROSFreeMem(), dos.lib/Read()
  1034.  
  1035. ros.library/ROSReadJoyPort                          ros.library/ROSReadJoyPort
  1036.  
  1037.    NAME
  1038.         ROSReadJoyPort -- return the state of the selected joy/mouse port  (V2)
  1039.  
  1040.    SYNOPSIS
  1041.         portState = ROSReadJoyPort(portNumber);
  1042.         D0                         D0
  1043.  
  1044.         ULONG ROSReadJoyPort(ULONG);
  1045.  
  1046.    FUNCTION
  1047.         This function is used to determine what device is attached to the
  1048.         joy port and the current position/button state. The user may attach
  1049.         a mouse, game controller, or joystick to the port and this function
  1050.         will dynamically detect which device is attached and return the
  1051.         appropriatly formatted 'portState'.
  1052.  
  1053.         This function works similar to lowlevel.lib's ReadJoyport(), so look
  1054.         there for further information.
  1055.         The only exceptions is the port assignment: port0/1 joyport as usual,
  1056.         but port2/3 is assigned to the parallel port, with the appropriate
  1057.         adapter you are able to connect two extra joysticks.
  1058.         Mouse and gamecontrollers are not supported by those adapters!
  1059.  
  1060.    INPUTS
  1061.         portNumber - port to read, in the range 0 to 3.
  1062.  
  1063.    RESULT
  1064.         portState - bit map that identifies the device and the current state
  1065.                     of that device dependant on the type of device attached
  1066.                     (like lowlevel.lib's ReadJoyPort()).
  1067.  
  1068.                     The following constants from <libraries/lowlevel.h>
  1069.                     are used to determine which device is attached and
  1070.                     the state of that device.
  1071.  
  1072.                     The type of device can be determined by applying
  1073.                     the mask JP_TYPE_MASK to the return value and comparing
  1074.                     the resultant value with the following:
  1075.  
  1076.                         JP_TYPE_NOTAVAIL        port data unavailable
  1077.                         JP_TYPE_GAMECTLR        game controller
  1078.                         JP_TYPE_MOUSE           mouse
  1079.                         JP_TYPE_JOYSTK          joystick
  1080.                         JP_TYPE_UNKNOWN         unknown device
  1081.  
  1082.                     If type = JP_TYPE_GAMECTLR the bit map of portState is:
  1083.                         JPF_BUTTON_BLUE         Blue - Stop
  1084.                         JPF_BUTTON_RED          Red - Select
  1085.                         JPF_BUTTON_YELLOW       Yellow - Repeat
  1086.                         JPF_BUTTON_GREEN        Green - Shuffle
  1087.                         JPF_BUTTON_FORWARD      Charcoal - Forward
  1088.                         JPF_BUTTON_REVERSE      Charcoal - Reverse
  1089.                         JPF_BUTTON_PLAY         Grey - Play/Pause
  1090.                         JPF_JOY_UP              Up
  1091.                         JPF_JOY_DOWN            Down
  1092.                         JPF_JOY_LEFT            Left
  1093.                         JPF_JOY_RIGHT           Right
  1094.  
  1095.                     If type = JP_TYPE_JOYSTK the bit map of portState is:
  1096.                         JPF_BUTTON_BLUE         Right
  1097.                         JPF_BUTTON_RED          Fire
  1098.                         JPF_JOY_UP              Up
  1099.                         JPF_JOY_DOWN            Down
  1100.                         JPF_JOY_LEFT            Left
  1101.                         JPF_JOY_RIGHT           Right
  1102.  
  1103.                     If type = JP_TYPE_MOUSE the bit map of portState is:
  1104.                         JPF_BUTTON_BLUE         Right mouse
  1105.                         JPF_BUTTON_RED          Left mouse
  1106.                         JPF_BUTTON_PLAY         Middle mouse
  1107.                         JP_MVERT_MASK           Mask for vertical counter
  1108.                         JP_MHORZ_MASK           Mask for horizontal counter
  1109.  
  1110.    NOTE
  1111.         When called the first time, for each port, this function tries to
  1112.         allocate the desired port, so do NOT call this routine from interrupts
  1113.         until the approprite resources are allocated (return value other than
  1114.         JP_TYPE_NOTAVAIL, see also ROSSetJoyPortAttrs()).
  1115.         If allocation failed a Retry/Cancel-Requester appears to inform the
  1116.         user about the problem (if not suppressed and if not in deathmode)
  1117.         and the function will return JP_TYPE_NOTAVAIL.
  1118.  
  1119.         This function interrupts the deathmode state with ROSSysCall() when 
  1120.         called the first time!
  1121.  
  1122.    SEE ALSO
  1123.         ROSSetJoyPortAttrs(), lowlevel.lib/ReadJoyPort()
  1124.  
  1125. ros.library/ROSRemTimerInt                          ros.library/ROSRemTimerInt
  1126.  
  1127.    NAME
  1128.         ROSRemTimerInt -- remove a previously installed timer interrupt
  1129.  
  1130.    SYNOPSIS
  1131.         ROSRemTimerInt(intHandle);
  1132.                        A1
  1133.  
  1134.         VOID AddTimerInt(ULONG);
  1135.  
  1136.    FUNCTION
  1137.         Removes a timer interrupt routine previously installed with
  1138.         ROSAddTimerInt().
  1139.  
  1140.         Closing the ros.library removes this timer interrupt automatically.
  1141.  
  1142.    INPUTS
  1143.         intHandle - handle obtained from ROSAddTimerInt(), if NULL nothing
  1144.                     happens
  1145.  
  1146.    NOTE
  1147.         This function interrupts the deathmode state with ROSSysCall()!
  1148.  
  1149.    SEE ALSO
  1150.         ROSAddTimerInt(), ROSStartTimer(), ROSStopTimer(), ROSSetTimerVec()
  1151.  
  1152. ros.library/ROSRequester                              ros.library/ROSRequester
  1153.  
  1154.     NAME
  1155.         ROSRequester -- Display a requester
  1156.  
  1157.     SYNOPSIS
  1158.         result = ROSRequester(TextFormat, ArgList, GadgetFormat)
  1159.         D0                    A0          A1       A2
  1160.  
  1161.         LONG ROSRequester(STRPTR, APTR, STRPTR)
  1162.  
  1163.     FUNCTION
  1164.         This procedure automatically builds a requester for you using
  1165.         intuition's EasyRequestArgs() (AutoRequest() on OS1.3) and then
  1166.         waits for a response from the user.
  1167.  
  1168.         The requester appears only if it is not disabled via ROSDisableReq()
  1169.         or your tasks pr_WindowPtr = -1.
  1170.         Do not set this pointer directly. Use instead ROSDisable()/ROSEnable().
  1171.         By default requesters are enabled.
  1172.  
  1173.         In deathmode requesters are always disabled.
  1174.         If requesters are disabled the 'result' will be always FALSE (NULL).
  1175.  
  1176.     INPUTS
  1177.         TextFormat - Format string, a la RawDoFmt(), for message in
  1178.             requester body. Lines are separated by the newline character ($0A).
  1179.             Formatting '%' functions are supported exactly as in RawDoFmt().
  1180.             Note: on OS1.3 max 5 textlines
  1181.         GadgetFormat - Format string for gadgets.  Text for separate
  1182.             gadgets is separated by '|'. You MUST specify at least one gadget.
  1183.             Note: max 2 gadgets on OS1.3
  1184.                   gadget format functions only supported on OS2.0+.
  1185.         argList - Arguments for format commands. Arguments for gadgets
  1186.                   follow arguments for bodytext
  1187.  
  1188.     RESULT
  1189.         0, 1, ..., N - Successive GadgetID values, for the gadgets
  1190.                        you specify for the requester.  NOTE: The numbering
  1191.                        from left to right is actually: 1, 2, ..., N, 0.
  1192.                        This is for compatibility with AutoRequest(), which has
  1193.                        FALSE for the rightmost gadget. 
  1194.  
  1195.     BUGS
  1196.         Do not rely on the 'result' of an one-button requester!
  1197.         Due a bug in intuitions AutoRequest()/EasyRequestArgs() the 'result'
  1198.         may be TRUE (1) or FALSE (0) because it's possible to satisfy an one-
  1199.         button requester with both short-cuts: AMIGA-B and AMIGA-V.
  1200.  
  1201.     SEE ALSO
  1202.         intuition.lib/AutoRequest(), intuition.lib/EasyRequestArgs(),
  1203.         exec.lib/RawDoFmt(), ROSDisableReq(), ROSEnableReq()
  1204.  
  1205. ros.library/ROSScreenToBack                        ros.library/ROSScreenToBack
  1206.  
  1207.     NAME
  1208.         ROSScreenToBack -- Send ROS screen to the back of the display
  1209.  
  1210.     SYNOPSIS
  1211.         ROSScreenToBack()
  1212.  
  1213.         VOID ROSScreenToBack(VOID);
  1214.  
  1215.     FUNCTION
  1216.         Sends the ROS screen to the back of the display if it is open and
  1217.         if NOT in deathmode.
  1218.  
  1219.     SEE ALSO
  1220.         ROSScreenToFront()
  1221.  
  1222. ros.library/ROSScreenToFront                      ros.library/ROSScreenToFront
  1223.  
  1224.     NAME
  1225.         ROSScreenToFront -- Make ROS screen the frontmost
  1226.  
  1227.     SYNOPSIS
  1228.         ROSScreenToFront()
  1229.  
  1230.         VOID ROSScreenToFront(VOID);
  1231.  
  1232.     FUNCTION
  1233.         Brings the ROS screen to the front of the display if it is open and
  1234.         if NOT in deathmode.
  1235.  
  1236.     SEE ALSO
  1237.         ROSScreenToBack()
  1238.  
  1239. ros.library/ROSSetCache                                ros.library/ROSSetCache
  1240.  
  1241.    NAME
  1242.         ROSSetCache -- Instruction & data cache control
  1243.  
  1244.    SYNOPSIS
  1245.         oldBits = ROSSetCache(cacheBits, cacheMask)
  1246.         D0                    D0         D1
  1247.  
  1248.         ULONG ROSSetCache(ULONG, ULONG);
  1249.  
  1250.    FUNCTION
  1251.         This function provides global control of any instruction or data
  1252.         caches that may be connected to the system.  All settings are
  1253.         global (until ros.library closed) -- per task control is not provided.
  1254.  
  1255.         Closing the ros.library reset former system cache settings.
  1256.  
  1257.    INPUTS
  1258.         cacheBits - new values for the bits specified in cacheMask.
  1259.                     use -1 to reset to system defaults (ignores cacheMask)
  1260.         cacheMask - a mask with ones for all bits to be changed
  1261.  
  1262.         Note: cacheBits/cacheMask may be overridden by values specified in
  1263.               ros.prefs (to support individual cache settings)
  1264.  
  1265.    RESULT
  1266.         oldBits - the complete prior values for all settings.
  1267.  
  1268.    NOTE
  1269.         As a side effect, this function clears all caches.
  1270.         This function interrupts the deathmode state with ROSSysCall()!
  1271.  
  1272.    SEE ALSO
  1273.         exec/execbase.i, exec.lib/CacheControl()
  1274.  
  1275. ros.library/ROSSetCopper                              ros.library/ROSSetCopper
  1276.  
  1277.    NAME
  1278.         ROSSetCopper -- install copperlist for ROS screen
  1279.  
  1280.    SYNOPSIS
  1281.         ROSSetCopper(flags, coplist)
  1282.                      D0     A0   
  1283.  
  1284.         VOID ROSSetCopper(ULONG, APTR);
  1285.  
  1286.    FUNCTION
  1287.         This function installs a new copper list for our ROS screen.
  1288.         Whenever this screen is the frontmost this copper list becomes the
  1289.         active (only in non-os-friedly mode!).
  1290.  
  1291.         Do NOT use "move.l #mycoplist,$dff080" or "move.w #0,$dff088" !!!!!!!
  1292.         This may crash the display if you are in non-deathmode and the ROS
  1293.         screen is not yet available or behind others.
  1294.         ROSSetCopper() takes this into account and displays this copper list as
  1295.         soon as possible.
  1296.  
  1297.         A screen switch forces always copper1 starting in a long frame!
  1298.  
  1299.    INPUTS
  1300.         flags - COPF_COPPER1/2: modify copper1 or copper2
  1301.                     Remember: copper1 is always started during vertical blank
  1302.                 COPF_STROBE: force an immediate copper start, move.w #0,$dff088
  1303.                     set 'coplist' to NULL for only strobe 
  1304.                 COPF_LOF/SHF: forces a long/short frame while starting copper
  1305.                     (to display interlaced screens correctly)
  1306.         coplist - copper list pointer, if NULL the old copper pointer remains
  1307.  
  1308.    NOTE
  1309.         This call is guaranteed to preserve all registers (except D0!!!) and is
  1310.         save to call from interrupts.
  1311.  
  1312.    SEE ALSO
  1313.         libraries/ros.i, ROSKillSystem()
  1314.  
  1315.  
  1316. ros.library/ROSSetDMA                                    ros.library/ROSSetDMA
  1317.  
  1318.    NAME
  1319.         ROSSetDMA -- modify DMA bits
  1320.  
  1321.    SYNOPSIS
  1322.         ROSSetDMA(DMACON)
  1323.                   D0                     
  1324.  
  1325.         VOID ROSSetDMA(UWORD);
  1326.  
  1327.    FUNCTION
  1328.         This function acts like a write to the DMACON register.
  1329.  
  1330.         Do NOT use "move.w #xxx,$dff096" !!!!!!!
  1331.         This may interfere with the system you are in non-deathmode, but
  1332.         ROSSetDMA() handles all exceptions correctly.
  1333.         
  1334.         DMA bit modification:
  1335.           - DMAF_BLTPRI: only in deathmode, but during a ROSSysCall() the
  1336.                          system DMA bit will be restored
  1337.           - DMAF_DMAEN: same like BLTPRI
  1338.           - DMAF_BPLEN: only if ROS screen in front (non-os-friendly mode!)
  1339.           - DMAF_COPEN: same like BPLEN
  1340.           - DMAF_BLTEN: same like BLTPRI
  1341.           - DMAF_SPREN: same like BPLEN
  1342.           - DMAF_DSKEN: never modified!!!
  1343.           - DMAF_AUDxEN: only if audio channels allocated
  1344.  
  1345.         A currently forbidden DMA modification is automatically updated as
  1346.         soon as possible (e.g. bitplane DMA if ROS screen behind others).
  1347.  
  1348.         Closing the ros.library reset former system DMA.
  1349.  
  1350.    INPUTS
  1351.         DMACON - DMA bits
  1352.  
  1353.    NOTE
  1354.         This call is guaranteed to preserve all registers (except D0!!!) and is
  1355.         save to call from interrupts.
  1356.  
  1357.    SEE ALSO
  1358.         ROSGetDMA(), hardware/dmabits.i
  1359.  
  1360. ros.library/ROSSetExitHandler                    ros.library/ROSSetExitHandler
  1361.  
  1362.    NAME
  1363.         ROSSetExitHandler -- add handler that is executed at exit key condition
  1364.  
  1365.    SYNOPSIS
  1366.         ROSSetExitHandler(handler);
  1367.                           A0
  1368.  
  1369.         VOID ROSSetExitHandler(APTR);
  1370.  
  1371.    FUNCTION
  1372.         Calling this routine causes the ROS to install an exit key conditon
  1373.         handler. Whenever this special key is pressed your handler is invoked
  1374.         (should be only once). Now it's time to finish your application. 
  1375.  
  1376.         The routine is called from within an interrupt, so normal
  1377.         restrictions apply. On entry A5 holds the custom base ($dff000) and
  1378.         A6 holds _ROSBase. Your code may trash all registers.
  1379.  
  1380.         The default exit key code is ESC but may be changed in ros.prefs.
  1381.         --> New for V2: Now joyport events may also generate exit events if
  1382.                         enabled via ROSSetJoyPortAttrs().
  1383.  
  1384.         You should remove this handler with ROSSetExitHandler(NULL).
  1385.         Closing the ros.library removes this exit handler automatically.
  1386.  
  1387.         But remember: Exit conditions occurs only if you set the master
  1388.                       interrupt bit via ROSSetInt(INTF_SETCLR|INTF_INTEN)!
  1389.  
  1390.    INPUTS
  1391.         handler - the routine to invoke upon exit key condition or NULL to
  1392.                   detach the handler
  1393.  
  1394.    NOTE
  1395.         This call is guaranteed to preserve all registers (except A0!!!) and is
  1396.         save to call from interrupts.
  1397.  
  1398.         The handler may be called more than once if your application isn't 
  1399.         fast enough to exit!!!
  1400.  
  1401.    SEE ALSO
  1402.  
  1403. ros.library/ROSSetInt                                    ros.library/ROSSetInt
  1404.  
  1405.    NAME
  1406.         ROSSetInt -- modify interrupt settings
  1407.  
  1408.    SYNOPSIS
  1409.         ROSSetInt(INTENA)
  1410.                   D0                     
  1411.  
  1412.         VOID ROSSetInt(UWORD);
  1413.  
  1414.    FUNCTION
  1415.         This function acts like a write to the INTENA register.
  1416.  
  1417.         Do NOT use "move.w #xxx,$dff09a" !!!!!!!
  1418.         This may interfere with the system if you are in non-deathmode, but
  1419.         ROSSetInt() handles all exceptions correctly.
  1420.  
  1421.         Only those bits are affected which belongs to previous ROSSetIntVec()
  1422.         calls. Look at ROSSetIntVec() for further information.
  1423.         
  1424.         In non-deathmode the master interrupt bit (INTB_INTEN) is emulated to
  1425.         support enable/disable of all ROS interrupts at once (system interrupts
  1426.         are still active!!!)
  1427.         
  1428.         Closing the ros.library reset former system interrupt bits.
  1429.  
  1430.    INPUTS
  1431.         INTENA - Int bits
  1432.                  Note: level 1/2/5/6 bits (disk, serial, timer) are not
  1433.                        supported!!!
  1434.                        Instead additonal bits are defined:  - KEYB
  1435.                                                             - CIAATIMA/B
  1436.                                                             - CIABTIMA/B
  1437.                  Look at ROSSetIntVec() for further details
  1438.    NOTE
  1439.         This call is guaranteed to preserve all registers (except D0!!!).
  1440.  
  1441.         Do NOT call this routine from interrupts if you want to modify the
  1442.         CIA interrupts (CIAATIMA/B, CIABTIMA/B)!!!!
  1443.  
  1444.    SEE ALSO
  1445.         ROSGetInt(), ROSSetIntVec(), libraries/ros.i
  1446.  
  1447. ros.library/ROSSetIntVec                              ros.library/ROSSetIntVec
  1448.  
  1449.    NAME
  1450.         ROSSetIntVec -- set a new handler for an interrupt vector
  1451.  
  1452.    SYNOPSIS
  1453.         success = ROSSetIntVec(intNum, handler)
  1454.         D0                     D0      A0               
  1455.  
  1456.         BOOL ROSSetIntVec(UWORD, APTR);
  1457.  
  1458.    FUNCTION
  1459.         This function attaches a new handler to the interrupt specified with
  1460.         'intNum'. Detach a handler with A0 = NULL.
  1461.         The routine is called from within an interrupt, so normal
  1462.         restrictions apply. On entry A5 holds the custom base ($dff000) and
  1463.         A6 holds _ROSBase. Your code may trash all registers.
  1464.         Your handler won't be invoked until you enable it (and the master int)
  1465.         via ROSSetInt(). After enabling your handler it's always invoked
  1466.         whether you taken over the systen or not.
  1467.  
  1468.         Interrupts are executed as follows:
  1469.  
  1470.         » INTB_BLIT
  1471.             - only in deathmode, during a ROSSysCall() the system routine
  1472.               will be restored so you do NOT use the blitter while the system
  1473.               is (partially) active
  1474.             - returncode is always TRUE
  1475.         » INTB_VERTB
  1476.             - always invoked, also without a call to ROSKillSystem()
  1477.             - in non-deathmode your vblank code may be called after display
  1478.               is started depending on the speed of higher prioritized vblank
  1479.               interrupts. If you want to synchronize custom chip modifications
  1480.               with the display you should use the copper.
  1481.             - but remember: in non-deathmode the vblank frequency may vary
  1482.               (not always 50Hz) if ROS screen behind others!
  1483.             - returncode is always TRUE
  1484.         » INTB_COPER
  1485.             - only if ROS screen in front
  1486.             - returncode is always TRUE
  1487.         » INTB_NMI (bit 15)
  1488.             - always invoked
  1489.             - returncode is always TRUE
  1490.         » INTB_AUD0..3
  1491.             - only if channels allocated, else the returncode will be FALSE
  1492.  
  1493.         Further 5 new int definitions are supported:
  1494.  
  1495.         » INTB_CIAATIMA/CIAATIMB/CIABTIMA/CIABTIMB
  1496.             - used to attach a handler to the specified CIA timer
  1497.             - returncode may be FALSE if CIA allocation failed, in this case a
  1498.               Retry/Cancel-Requester appears (if not suppressed)
  1499.             - if returncode TRUE the specified timer bits are set to 0 (timer
  1500.               stopped) and now you may modify the contents of the CIA control
  1501.               register (CRA/CRB)
  1502.             - never read or write the CIA interrupt control register (ICR),
  1503.               use instead ROSSetInt() to enable/disble CIA interrupts!!!!!!
  1504.  
  1505.         » INTB_KEYB
  1506.             - used to track keyboard events (see also ROSGetKey())
  1507.             - only invoked if ROS screen in front!!!
  1508.             - your handler is called with additional register D0 setup:
  1509.                 * the lower word contains the keycode ($0..$67) with the
  1510.                   additional key_up/down flag (bit7 set for key-up condition)
  1511.                 * the upper word contains the qualifier bits (shift, alt, ...)
  1512.             - in non-deathmode it's up to you passing this key to other system
  1513.               components (like intuition.lib, commodities.lib, ...)
  1514.                 * set the ZERO-flag at the end of your handler to pass the key
  1515.                   to other system components, e.g.  moveq #0,d0
  1516.                 * else clear the ZERO-flag, e.g.  moveq #1,d0
  1517.                 * but remember: if you catch all key events screen switching
  1518.                   and other system hotkeys dosn't work!!!
  1519.                 * by default all keys without left-amiga or without control
  1520.                   qualifiers are catched to prevent background menu activities
  1521.                   and other undesirable things
  1522.             - returncode is always TRUE
  1523.  
  1524.         All other interrupt bits are NOT supported!!!
  1525.  
  1526.         Closing the ros.library detaches interrupt handlers automatically.
  1527.  
  1528.    INPUTS
  1529.         intnum - the Paula interrupt bit number (0 through 14). Processor
  1530.                  level seven interrupts (NMI) are encoded as intNum 15.
  1531.                  Note: level 1/2/5/6 bits (disk, serial, timer) are not
  1532.                        supported!!!
  1533.                        Instead additonal bits are defined:  - KEYB
  1534.                                                             - CIAATIMA/B
  1535.                                                             - CIABTIMA/B
  1536.         handler - the routine to invoke or NULL to detach the handler
  1537.  
  1538.    RESULT
  1539.         success - TRUE if handler successfully attached
  1540.  
  1541.    NOTE
  1542.         This call is guaranteed to preserve all other registers.
  1543.  
  1544.         Do NOT call this routine from interrupts if you want to add a CIA
  1545.         handler for the first time!!! After a successful call you may change
  1546.         this vector with ROSSetIntVec() also from interrupts because the
  1547.         desired CIA is already allocated.
  1548.  
  1549.    SEE ALSO
  1550.         ROSSetInt(), ROSGetInt(), libraries/ros.i
  1551.  
  1552. ros.library/ROSSetJoyPortAttrs                  ros.library/ROSSetJoyPortAttrs
  1553.  
  1554.    NAME
  1555.         ROSSetJoyPortAttrs -- change attributes of a joy port  (V2)
  1556.  
  1557.    SYNOPSIS
  1558.         success = ROSSetJoyPortAttrs(portNumber, attribute);
  1559.         D0                           D0          D1
  1560.  
  1561.         BOOL ROSSetJoyPortAttrs(ULONG, ULONG);
  1562.  
  1563.    FUNCTION
  1564.         This function allows modification of several attributes held by
  1565.         ROSReadJoyPort() about both it's operation and the type of controller
  1566.         currently plugged into the port.
  1567.  
  1568.         ROSReadJoyPort()'s default behavior is to attempt to automatically
  1569.         sense the type of controller plugged into any given port, when
  1570.         asked to read that port. This causes most reads to take longer than
  1571.         if there were no auto-sensing. 
  1572.         That's why ROSSetJoyPortAttrs() allows the programmer to notify
  1573.         ROSReadJoyPort() to stop spending time attempting to sense which type
  1574.         of controller is in use -- and, optionally, to force ROSReadJoyPort()
  1575.         into utilizing a certain controller type.
  1576.  
  1577.         This function is also used to turn on the rawkey code creation for the
  1578.         given port. This means ROSReadJoyPort() is called every frame to
  1579.         determine current port state and it's return values are converted into
  1580.         corresponding rawkey codes. To reduce the overhead caused by this
  1581.         attribute you should avoid the autosensing!
  1582.         ROS uses the same rawkey codes like lowlevel.library so look there
  1583.         (libraries/lowlevel.i) for further information.
  1584.  
  1585.    INPUTS
  1586.         portNumber - the joyport in question (0-3).
  1587.         attribute  - one of the following attributes (from libraries/ros.i):
  1588.  
  1589.             » ROSJPA_AUTOSENSE
  1590.                 - ROSReadJoyPort() will attempt to determine the type of
  1591.                   controller plugged into the given port automatically
  1592.                 - returns TRUE if port allocation succeeded
  1593.             » ROSJPA_MOUSE
  1594.                 - sets current controller type to mouse
  1595.                 - returns TRUE if port allocation succeeded
  1596.             » ROSJPA_JOYSTCK
  1597.                 - sets current controller type to joystick
  1598.                 - returns TRUE if port allocation succeeded
  1599.             » ROSJPA_GAMECTLR
  1600.                 - sets current controller type to game controller
  1601.                 - returns TRUE if port allocation succeeded
  1602.             » ROSJPA_ADDKEYS
  1603.                 - starts creating rawkey codes for the joystick/game controller
  1604.                   on the given unit, codes are passed to your keyboard-handler
  1605.                   (see also ROSSetIntVec()) so the same restrictions apply:
  1606.                   - only invoked if ROS screen in front!!!
  1607.                   - your handler is called with additional register D0 setup:
  1608.                       * the lower word contains the key code with additional
  1609.                         key_up/down flag (bit7 set for key-up condition)
  1610.                       * the upper word contains the qualifier bits
  1611.                   - but:
  1612.                       * these rawkey codes are NEVER passed to other system
  1613.                         components (like intuition), only you will receive it!
  1614.                       * in addition to the keyboard interrupt (INTB_INTEN/KEYB)
  1615.                         the vblank interrupt (INTB_VERTB) must be active
  1616.                 - NOTE (1): Now your keyboard-handler is also called from a
  1617.                             level3 interrupt. That's why it must be reentrant!!
  1618.                             (reason: joystick-movement (lev3) may interrupt a
  1619.                             currently in-progress keypress-event (lev2))
  1620.                 - NOTE (2): Your handler may be called more than once per frame
  1621.                             because multiple joy-movements generate multiple
  1622.                             key codes!
  1623.                 - NOTE (3): Now your exit-handler must also be reentrant
  1624.                             because joyport events may generate exit events!
  1625.                 - returns TRUE if port allocation succeeded
  1626.             » ROSJPA_REMKEYS
  1627.                 - stops rawkey code creation on the given unit
  1628.                 - returns always TRUE, whether port allocated or not!!!
  1629.             » ROSJPA_REINITIALIZE
  1630.                 - return a given port to it's initial state:
  1631.                     * set to autosense
  1632.                     * stop rawkey code creation
  1633.                     * deallocate resources
  1634.                 - closing the ros.library reinitializes joy ports automatically
  1635.                 - returns always TRUE, whether port allocated or not!!!
  1636.                 
  1637.    RESULT
  1638.         success - TRUE if port allocation succeeded, or FALSE upon failure
  1639.  
  1640.    NOTE
  1641.         When called the first time, for each port, this function tries to
  1642.         allocate the desired port. Once it returns TRUE (except for ROSJPA_
  1643.         REMKEYS/REINITIALIZE) the appropriate port is allocated and you may
  1644.         call ROSReadJoyPort() from interrupts.
  1645.         If allocation failed a Retry/Cancel-Requester appears to inform the
  1646.         user about the problem (if not suppressed and if not in deathmode)
  1647.         and this function will return FALSE.
  1648.  
  1649.         This function interrupts the deathmode state with ROSSysCall()!
  1650.  
  1651.    SEE ALSO
  1652.         ROSReadJoyPort(), <libraries/lowlevel.i>
  1653.  
  1654. ros.library/ROSSetTimerVec                          ros.library/ROSSetTimerVec
  1655.  
  1656.    NAME
  1657.         ROSSetTimerVec -- change the timer interrupt entry point
  1658.  
  1659.    SYNOPSIS
  1660.         ROSSetTimerVec(intRoutine, intHandle);
  1661.                        A0          A1
  1662.  
  1663.         VOID ROSSetTimerVec(APTR, ULONG);
  1664.  
  1665.    FUNCTION
  1666.         This routine changes the interrupt entry point that is assocatied with
  1667.         a timer interrupt created by ROSAddTimerInt().
  1668.         No timer modification is done (no restart, no stop). The next interrupt
  1669.         will execute your new 'intRoutine'.
  1670.  
  1671.    INPUTS
  1672.         intRoutine - the routine to invoke upon timer interrupts.
  1673.         intHandle - handle obtained from ROSAddTimerInt().
  1674.  
  1675.    NOTE
  1676.         This call is guaranteed to preserve all registers (except A1!!!) and is
  1677.         save to call from interrupts.
  1678.  
  1679.    SEE ALSO
  1680.         ROSAddTimerInt(), ROSRemTimerInt(), ROSStartTimer(), ROSStopTimer()
  1681.  
  1682. ros.library/ROSStartTimer                            ros.library/ROSStartTimer
  1683.  
  1684.    NAME
  1685.         ROSStartTimer -- start the timer associated with the timer interrupt
  1686.  
  1687.    SYNOPSIS
  1688.         ROSStartTimer(timeInterval, continuous, intHandle);
  1689.                       D0            D1          A1
  1690.  
  1691.         VOID ROSStartTimer(ULONG, BOOL, ULONG);
  1692.  
  1693.    FUNCTION
  1694.         This routine starts a stopped timer that is assocatied with a
  1695.         timer interrupt created by ROSAddTimerInt().
  1696.  
  1697.         But remember: Timer interupts occurs only if you set the master
  1698.                       interrupt bit via ROSSetInt(INTF_SETCLR|INTF_INTEN)!
  1699.  
  1700.    INPUTS
  1701.         timeInterval - number of micoseconds between interrupts. The
  1702.                        maximum value allowed is 90,000. If higher values
  1703.                        are passed there will be unexpected results.
  1704.         continuous - FALSE for a one shot interrupt. TRUE for multiple
  1705.                      interrupts.
  1706.         intHandle - handle obtained from ROSAddTimerInt().
  1707.  
  1708.    NOTE
  1709.         This call is guaranteed to preserve register A0 and is save to call
  1710.         from interrupts.
  1711.  
  1712.    SEE ALSO
  1713.         ROSAddTimerInt(), ROSRemTimerInt(), ROSSetTimerVec(), ROSStopTimer()
  1714.  
  1715. ros.library/ROSStopTimer                              ros.library/ROSStopTimer
  1716.  
  1717.    NAME
  1718.         ROSStopTimer -- stop the timer associated with the timer interrupt
  1719.  
  1720.    SYNOPSIS
  1721.         ROSStopTimer(intHandle);
  1722.                      A1
  1723.  
  1724.         VOID ROSStopTimer(ULONG);
  1725.  
  1726.    FUNCTION
  1727.         Stops the timer associated with the timer interrupt handle passed.
  1728.         This is used to stop a continuous timer started by
  1729.         ROSStartTimer().
  1730.  
  1731.    INPUTS
  1732.         intHandle - handle obtained from ROSAddTimerInt()
  1733.  
  1734.    NOTE
  1735.         This call is guaranteed to preserve all registers (except A1!!!) and is
  1736.         save to call from interrupts.
  1737.  
  1738.    SEE ALSO
  1739.         ROSAddTimerInt(), ROSRemTimerInt(), ROSSetTimerVec(), ROSStartTimer()
  1740.  
  1741. ros.library/ROSSysCall                                  ros.library/ROSSysCall
  1742.  
  1743.    NAME
  1744.         ROSSysCall -- interrupts deathmode to enable system calls
  1745.  
  1746.    SYNOPSIS
  1747.         ROSSysCall()
  1748.  
  1749.         VOID ROSSysCall(VOID)
  1750.  
  1751.    FUNCTION
  1752.         This function provides a method to call system functions from within
  1753.         deathmode.
  1754.  
  1755.         YOU SHOULD NEVER NEED THIS FUNCTION! IT SHOULD BE A PRIVATE ROS CALL.
  1756.         DO NOT USE THIS CALL WITHOUT GOOD JUSTIFICATION.
  1757.  
  1758.         In order to restore normal deathmode, the programmer must execute
  1759.         exactly one call to ROSSysCallEnd() for every call to ROSSysCall().
  1760.  
  1761.         During a SysCall all ROS interrupts continue executing (look at
  1762.         ROSSetIntVec() for details).
  1763.         But remember: system interrupts are also active and additional system
  1764.         DMA will be set!
  1765.         The blitter will be disowned so you do NOT bash the blitter until
  1766.         ROSSysCallEnd() is called.
  1767.         With ROS V2 WaitBlit() is also called before entering the system.
  1768.         Do NOT call system functions during a SysCall which may cause any
  1769.         visual modifications (like OpenScreen(), ScreenToBack(), ...).
  1770.         These functions will never return as long as the deathmode is the
  1771.         active one!!!
  1772.  
  1773.         Calling ROSSysCall() without a deathmode killed system is harmless.
  1774.  
  1775.    RESULT
  1776.         A partially active system.
  1777.  
  1778.    NOTE
  1779.         This call is guaranteed to preserve all registers.
  1780.  
  1781.    SEE ALSO
  1782.         ROSKillSystem(), ROSSetDMA(), ROSSetIntVec(), ROSSysCallEnd()
  1783.  
  1784. ros.library/ROSSysCallEnd                            ros.library/ROSSysCallEnd
  1785.  
  1786.    NAME
  1787.         ROSSysCallEnd -- return from a SysCall
  1788.  
  1789.    SYNOPSIS
  1790.         ROSSysCallEnd()
  1791.  
  1792.         VOID ROSSysCallEnd(VOID)
  1793.  
  1794.    FUNCTION
  1795.         Call this function to return from a SysCall after a matching
  1796.         ROSSysCall() has been executed.
  1797.  
  1798.    RESULT
  1799.         A deathmode killed system.
  1800.  
  1801.    NOTE
  1802.         This call is guaranteed to preserve all registers.
  1803.  
  1804.    SEE ALSO
  1805.         ROSSysCall()
  1806.  
  1807. ros.library/ROSWaitVBlank                            ros.library/ROSWaitVBlank
  1808.  
  1809.    NAME
  1810.        ROSWaitVBlank -- Wait for the vertical blank to occur
  1811.        
  1812.    SYNOPSIS
  1813.        ROSWaitVBlank()
  1814.  
  1815.        VOID ROSWaitVBlank(VOID);
  1816.  
  1817.    FUNCTION
  1818.        Waits for vertical blank to occur and than returns to the caller.
  1819.        --> New for V2: If not in real deathmode this function uses the
  1820.                        graphics.library WaitTOF() call to ensure
  1821.                        compatibility with foreign OS screens!
  1822.  
  1823.    NOTE
  1824.         This call is guaranteed to preserve all registers.
  1825.         This call does not require A6 to be loaded with the library base.
  1826.  
  1827.    BUGS
  1828.         Previous V1.xx documentation stated:  "... and is save to call from
  1829.         interrupts."
  1830.         This is always wrong! Do NOT use this function from within interrupts!
  1831.  
  1832. ros.library/ROSWriteFile                              ros.library/ROSWriteFile
  1833.  
  1834.    NAME
  1835.         ROSWriteFile -- Write a number bytes to a file
  1836.  
  1837.    SYNOPSIS
  1838.         actLength/errorcode = ROSWriteFile(flags, length, offset, name, buffer)
  1839.         D0        D1                       D0     D1      D2      A0    A1
  1840.  
  1841.         ULONG/ULONG ROSWriteFile(ULONG, ULONG, ULONG, STRPTR, VOID *);
  1842.  
  1843.    FUNCTION
  1844.         This function writes 'length' bytes to the file 'name' using
  1845.         dos.library's Write(). 
  1846.         Set 'offset' to NULL to overwrite an existing file (file opened with
  1847.         MODE_NEWFILE). In the other case the data is written to the file 'name'
  1848.         with an 'offset' from the beginning (file opened with MODE_READWRITE).
  1849.         This can be used to append/replace data to/in an existing file. If the
  1850.         file doesn't exists or if filelength shorter than 'offset' a seek error
  1851.         occurs.
  1852.         A1 points to a buffer from where the data is taken from. 
  1853.  
  1854.         Remember: On error a corrupt or a 0-byte-file may still exists!!!
  1855.                   It's up to you to delete this.
  1856.  
  1857.         If ROSRWF_DISKWAIT flag set the routine assumes that you want to write
  1858.         'name' to a floppy. This means:
  1859.          - waiting for the right disk to be inserted
  1860.            (implementation: DOS error codes DEVICE_NOT_MOUNTED, NOT_A_DOS_DISK,
  1861.            NO_DISK force retry until any other error occurs)
  1862.            --> New for V2: waiting may be cancelled via ROSDiskState()
  1863.          - waiting until disk drive stopped
  1864.            (implementation: polling disk.resource until drives are ready)
  1865.  
  1866.         Since OS2.0 it's possible to write files to your program path instead
  1867.         of the current directory using progdir:xxx.
  1868.         On OS1.3 the "progdir:" string is automatically removed by ROS so you
  1869.         don't have to worry about it. The only thing the user have to do is a
  1870.         "CD" to the program directory before starting (only on OS1.3). ;-)
  1871.  
  1872.         WARNING: It may be dangerous to use this routine within deathmode!
  1873.                  Because of the AMIGA's multitasking facilities it isn't
  1874.                  possible (isn't it???) to wait till the final end of a write
  1875.                  operation. That's why I use a simple delay of 2 seconds after
  1876.                  any write operation in deathmode. If your filesystem is to 
  1877.                  slow to write all the data within this time your partition
  1878.                  will be NOT validated!!!
  1879.                  You've been warned!!!
  1880.  
  1881.    INPUTS
  1882.         flags - use ROSRWF_DISKWAIT if you want to write to a floppy
  1883.         length - number of bytes to write
  1884.         offset - NULL for overwrite mode, else a number of bytes to skip
  1885.                  before writing into an existing file
  1886.         name - pointer to a null-terminated string
  1887.         buffer - pointer to buffer where data is taken from
  1888.    
  1889.    RESULT
  1890.         actLength - number of bytes written or -1 if error
  1891.         errorcode - DOS error code on failure (may be NULL!!!)
  1892.  
  1893.    NOTE
  1894.         This function interrupts the deathmode state with ROSSysCall()!
  1895.  
  1896.    SEE ALSO
  1897.         ROSDeleteFile(), ROSDiskState(), dos.lib/Write()
  1898.  
  1899.  
  1900.